
#include <cstring>
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <queue>
#include <bitset>
#include <algorithm>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <complex>
#include <cassert>
// #pragma comment(linker,"/STACK:102400000,102400000")
using namespace std;
#define LL long long
#define pb push_back
#define mp make_pair
#define x first
#define y second
template <typename T> inline void checkMax(T &a, T b) {a = a>b?a:b;}
template <typename T> inline void checkMin(T &a, T b) {a = a<b?a:b;}
typedef pair<int, int> PII;
typedef vector<int> vi;
const double PI = acos(-1.0);
const double eps = 1e-8;
#define MAXN 100006
#define MOD 1000000007

LL N, L, K, M;

LL c[2][MAXN], a[MAXN], b[MAXN];

int lowbit(int x) {
    return x & (-x);
}

void update(int x, int now, LL add) {
    while (x <= M) {
        c[now][x] += add;
        c[now][x] %= MOD;
        x += lowbit(x);
    }
}

LL query(int x, int now) {
    LL res = 0LL;
    while (x) {
        res += c[now][x];
        x -= lowbit(x);
        res %= MOD;
    }
    return res;
}

void work() {
    for (int i = 1; i <= N; i ++) {
        cin >> a[i];
        b[i] = a[i];
    }
    if (L <= N) {
        L %= MOD;
        cout << L << endl; return ;
    }
    sort(b + 1, b + 1 + N);
    int bn = unique(b + 1, b + 1 + N) - b - 1;
    for (int i = 1; i <= N; i ++) {
        a[i] = lower_bound(b + 1, b + 1 + bn, a[i]) - b;
    }
    M = bn;
    int now = 1, pre = 0;
    memset(c[pre], 0, sizeof(c[pre]));
    LL res = L;
    LL seg_num = L / N;
    if (L % N) seg_num ++;
    int num = L % N;
    if (num == 0) {
        num = N;
    }
    for (int i = 2; i <= min(K, seg_num); i ++) {
        memset(c[now], 0, sizeof(c[now]));
        for (int j = 1; j <= N; j ++) {
            LL q = query(a[j], pre);
            if (i == 2) {
                q = 1LL;
            }
            update(a[j], now, q);
        }
        for (int j = 1; j <= N; j ++) {
            LL tmp = query(a[j], now);
            if (j <= num) {
                res += tmp * ((seg_num - i + 1) % MOD);
            } else {
                res += tmp * ((seg_num - i) % MOD);
            }
            res %= MOD;
        }
        swap(pre, now);
    }
    cout << res << endl;
}
int main() { 
#ifdef __SKT__
    freopen("in", "r", stdin);
#endif
    ios::sync_with_stdio(false);
    while (cin >> N >> L >> K) {
        work();
    }
    return 0;
}
